//
//  MGNetworkAPI.h
//  CPManage
//
//  Created by lvho on 17/4/14.
//  Copyright © 2017年 com.jiaoshou.chen. All rights reserved.
//
//  缓存：YYCache

#import <Foundation/Foundation.h>
#import <AFNetworking/AFNetworking.h>
#import <AFNetworkActivityIndicatorManager.h>
#import "MSLRequsetFactory.h"
#import "MSNetWorkDomain.h"

/** 请求成功的Block */
typedef void(^MSRequestSuccess)(id responseObject);

/** 请求失败的Block */
typedef void(^MSRequestFailed)(NSError *error);

/** 缓存的Block */
typedef void(^MSRequestCache)(id responseCache);

/** 上传或者下载的进度, Progress.completedUnitCount:当前大小 - Progress.totalUnitCount:总大小*/
typedef void (^MSProgressBlock)(NSProgress *progress);

@interface MSNetworkAPI : NSObject

/**
 取消所有HTTP请求
 */
+ (void)cancelAllRequest;

/**
 取消指定URL的HTTP请求
 */
+ (void)cancelRequestWithURL:(NSString *)URL;

/**
 开启日志打印 (Debug级别)
 */
+ (void)openLog;

/**
 关闭日志打印,默认关闭
 */
+ (void)closeLog;



/**
 *  发送网络请求，参数、url封装在Request对象中 主要用于高频请求接口、多domain地址
 *
 *  @param request           request对象，包括参数、url
 *  @param cacheBlock        缓存消息
 *  @param success           成功消息
 *  @param failure           失败消息
 */
-(void)postWithRequest:(MSLRequsetFactory *)request
         responseCache:(MSRequestCache)cacheBlock
               success:(MSRequestSuccess)success
               failure:(MSRequestFailed)failure;

/**
 *  GET请求,无缓存
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters 请求参数
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)path
                            domain:(NSString *)domain
                        parameters:(id)parameters
                           success:(MSRequestSuccess)success
                           failure:(MSRequestFailed)failure;

/**
 *  GET请求,无缓存
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters 请求参数
 *  @param needAnalisys 是否需要解析responseObj
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)path
                            domain:(NSString *)domain
                        parameters:(id)parameters
                      needAnalisys:(BOOL)needAnalisys
                           success:(MSRequestSuccess)success
                           failure:(MSRequestFailed)failure;

/**
 *  GET请求,自动缓存
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters    请求参数
 *  @param cacheBlock    缓存数据的回调
 *  @param success       请求成功的回调
 *  @param failure       请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)path
                            domain:(NSString *)domain
                        parameters:(id)parameters
                     responseCache:(MSRequestCache)cacheBlock
                           success:(MSRequestSuccess)success
                           failure:(MSRequestFailed)failure;

/**
 *  POST请求,无缓存
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters 请求参数
 *  @param isJson     是否上传json数据
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)POST:(NSString *)path
                             domain:(NSString *)domain
                         parameters:(id)parameters
                         isJsonData:(BOOL)isJson
                            success:(MSRequestSuccess)success
                            failure:(MSRequestFailed)failure;

/**
 *  POST请求,自动缓存
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters    请求参数
 *  @param isJson     是否上传json数据
 *  @param cacheBlock    缓存数据的回调
 *  @param success       请求成功的回调
 *  @param failure       请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)POST:(NSString *)path
                             domain:(NSString *)domain
                         parameters:(id)parameters
                         isJsonData:(BOOL)isJson
                      responseCache:(MSRequestCache)cacheBlock
                            success:(MSRequestSuccess)success
                            failure:(MSRequestFailed)failure;

/**
 *  上传文件
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters 请求参数
 *  @param name       文件对应服务器上的字段
 *  @param filePath   文件本地的沙盒路径
 *  @param progress   上传进度信息
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)uploadFileWithURL:(NSString *)path
                                          domain:(NSString *)domain
                                      parameters:(id)parameters
                                            name:(NSString *)name
                                        filePath:(NSString *)filePath
                                        progress:(MSProgressBlock)progress
                                         success:(MSRequestSuccess)success
                                         failure:(MSRequestFailed)failure;

/**
 *  上传单/多张图片
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param parameters 请求参数
 *  @param name       图片对应服务器上的字段
 *  @param images     图片数组
 *  @param fileNames  图片文件名数组, 可以为nil, 数组内的文件名默认为当前日期时间"yyyyMMddHHmmss"
 *  @param imageScale 图片文件压缩比 范围 (0.f ~ 1.f)
 *  @param imageType  图片文件的类型,例:png、jpg(默认类型)....
 *  @param progress   上传进度信息
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)uploadImagesWithURL:(NSString *)path
                                            domain:(NSString *)domain
                                        parameters:(id)parameters
                                              name:(NSString *)name
                                            images:(NSArray<UIImage *> *)images
                                         fileNames:(NSArray<NSString *> *)fileNames
                                        imageScale:(CGFloat)imageScale
                                         imageType:(NSString *)imageType
                                          progress:(MSProgressBlock)progress
                                           success:(MSRequestSuccess)success
                                           failure:(MSRequestFailed)failure;

/**
 *  下载文件
 *
 *  @param path       请求地址
 *  @param domain     请求域名
 *  @param fileDir  文件存储目录(默认存储目录为Download)
 *  @param progress 文件下载的进度信息
 *  @param success  下载成功的回调(回调参数filePath:文件的路径)
 *  @param failure  下载失败的回调
 *
 *  @return 返回NSURLSessionDownloadTask实例，可用于暂停继续，暂停调用suspend方法，开始下载调用resume方法
 */
+ (__kindof NSURLSessionTask *)downloadWithURL:(NSString *)path
                                        domain:(NSString *)domain
                                       fileDir:(NSString *)fileDir
                                      progress:(MSProgressBlock)progress
                                       success:(void(^)(NSString *filePath))success
                                       failure:(MSRequestFailed)failure;


@end
